/**
 * 给定一个只包括三种括号 '(' , ')','{' , '}','[' , ']' 的字符串
 * 判断字符串是否有效
 * 左括号必须有相同类型右括号闭合
 * 左括号必须以正确的顺序闭合 - 如 '{[}]' 顺序不对 不正确
 * 解题步骤：
 * 扫描字符串，遇左括号入栈，遇到和栈定括号（最后push入栈的） 类型匹配的右括号就出栈，不匹配判定不合法
 * 栈空了算合法
 * @param {string} s
 */

const isValid = function (s) {
  // 如果是奇数直接 false
  if (s.length % 2 === 1) {
    return false
  }
  const stack = []
  const map = new Map([
    ['(', ')'],
    ['{', '}'],
    ['[', ']']
  ])
  for (let i = 0; i < s.length; i += 1) {
    const c = s[i] // 每一个字符
    if (map.has(c)) {
      stack.push(c)
    } else {
      const t = stack[stack.length - 1] // 栈顶括号，数组最后一位
      if (map.get(t) === c) {
        stack.pop() // 删除
      } else {
        return false
      }
    }
  }
  return stack.length === 0
}

console.log(isValid('{(([()]))}'))
